package lv.clientedisqueria.client;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import lv.mensajeriadisqueria.mensaje.Mensaje;

/**
 * Esta es la clase cliente que se comunica con el server
 */
public class ClienteServer {

	private static final Integer PORT = 10101;
	private static final String HOST = "192.168.9.60";
//	private static final String HOST = "127.0.0.1";

	private static ClienteServer instance = null;
	private Object objeto;
	private Socket socket;
	
	private ClienteServer(){}
	
	public static ClienteServer getInstance() {
		if(instance == null){
			instance = new ClienteServer();
		}
		return instance;
	}
	
	public void mandarMensaje(String clave, Object objecto) {
		try {
			socket = new Socket(HOST, PORT);
			ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
			Mensaje mensaje = new Mensaje(clave, objecto);
			outputStream.writeObject(mensaje);
			recibirMensaje();
		} catch (UnknownHostException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
	
	public void recibirMensaje() {
		ObjectInputStream inputStream;
		try {
			inputStream = new ObjectInputStream(socket.getInputStream());
			Mensaje mensaje = (Mensaje)inputStream.readObject();
			if (mensaje.getMensaje().equalsIgnoreCase(Mensaje.EXCEPTION)) {
				throw new RuntimeException((Throwable)mensaje.getObjeto());
			}
			setObjeto(mensaje);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		}
	}

	private void setObjeto(Mensaje mensaje) {
		objeto = mensaje.getObjeto(); 
	}
	
	public Object getObjeto() {
		return objeto;
	}
}